
#include "app_gpio.h"
#include "string.h" 
#include "stdio.h"
#include	"STC8G_H_ADC.h"


#ifdef SEVEN_POSITIVE
// 共阳极数码管: 注意：低电平（0）点亮段，高电平（1）熄灭段。
char seven_positive_table[] = {
    0xc0, // 0
    0xf9, // 1
    0xa4, // 2
    0xb0, // 3
    0x99, // 4
    0x92, // 5
    0x82, // 6
    0xf8, // 7
    0x80, // 8
    0x90, // 9
    0x88, // A
    0x83, // B
    0xc6, // C
    0xa1, // D
    0x86, // E
    0x8e // F
    };

#define POS_DOTPOINT 0X7F   // 如果有小数点， 则填充。
  //  共阴极数码管 //  注意：高电平（1）点亮段，低电平（0）熄灭段。
#else
  unsigned char seven_negitive_table[] = {
    0x3F, // 0
    0x06, // 1
    0x5B, // 2
    0x4F, // 3
    0x66, // 4
    0x6D, // 5
    0x7D, // 6
    0x07, // 7
    0x7F, // 8
    0x6F, // 9
    0x77, // A
    0x7C, // B
    0x39, // C
    0x5E, // D
    0x79, // E
    0x71 // F
    };

    #define NEG_DOTPOINT 0X80   // 如果有小数点， 则填充。
#endif

unsigned short newadc,adc0_val,adc1_val;
unsigned char adc_ch=0;

float fadc0,fadc1;

void convert_to_num_str(unsigned char * digs);
		
void int_num(float adc1,float adc0);

#define REF_VTG 2.495		
// 5000/4096=1.22mV 
unsigned char number_string[16];
unsigned char adc_chg=0;
void adc_convert()
{	

	newadc=Get_ADCResult(adc_ch);
	if(newadc==4096) return;
	
	switch(adc_ch)
	{
		case 0:
			if(adc0_val==newadc)break;
			adc0_val=newadc;
		  fadc0=adc0_val*REF_VTG; // 000;
		  fadc0/=4096;
		   
			adc_chg=1;
			break;
		case 1:
			if(adc1_val==newadc)break;
			adc1_val=newadc;
		  fadc1=adc1_val*5; // 000;
		  fadc1/=4096;

			adc_chg=1;
			break;
	}
	if(adc_chg)
	{		 
		int_num(fadc1,fadc0);
		//int_num(2.9,0.76); // fadc1 : 3number, fadc0 :4number.
		convert_to_num_str(number_string);
	}
	adc_ch++;
	if(adc_ch>=2){adc_ch=0;}
	
	
}	

void int_num(float adc1,float adc0)
{	 
	char t0[10]={'\0'};
	char t1[10]={'\0'};
	char i;
	for(i=0;i<16;i++)	// 清除，
	{
		number_string[i]='\0';
	}
	if(adc1>9) sprintf(t1,"%2.2f",adc1);
		else	
	if(adc1>1) sprintf(t1,"%1.3f",adc1);
	else
		sprintf(t1,"%0.3f",adc1);
	
		if(adc0>9) sprintf(t0,"%2.1f",adc0);
		else	
	if(adc0>1) sprintf(t0,"%1.2f",adc0);
	else
		sprintf(t0,"%0.2f",adc0);
	
	strcat(number_string,t1);
  strcat(number_string,t0);		
}
		
    unsigned char senddata[8];		
		
// 最多转换成8个数字（包括小数点）
void convert_to_num_str(unsigned char * digs){
    int i;
    unsigned char len;
    char sdata;
		unsigned char dval=0;

    unsigned char cnt=0;
    len=strlen(digs);    
    for(i=1 ;i<=len;i++)
    {
        sdata=digs[len-i];
        if(sdata =='.'){         // 如果是小数点，处理。
            i++;
            sdata=digs[len-i];  // 读取下一个实际数据。
					
						
					// add dot:
					#ifdef SEVEN_POSITIVE
					dval=seven_positive_table[sdata-0x30];
            dval&=POS_DOTPOINT;
					#else
					dval=seven_negitive_table[sdata-0x30];
						dval|=NEG_DOTPOINT;
					#endif

        }else
				{
					
					// clear dot
					#ifdef SEVEN_POSITIVE
					dval=seven_positive_table[sdata-0x30];
						dval|=~POS_DOTPOINT;            	// 0x80
					#else
					dval=seven_negitive_table[sdata-0x30];
						dval&=~NEG_DOTPOINT;							// 0x7f
					#endif
				}
        senddata[cnt++]=dval;       
    }


}

unsigned char num_sel=0;
unsigned char out_data;
#ifdef SEVEN_POSITIVE
#define NUM_ON 1
#define NUM_OFF 0
#else
#define NUM_ON 0
#define NUM_OFF 1
#endif
void scan_num()
{
	// first close show:
	p_a_dig1=NUM_OFF;p_a_dig2=NUM_OFF;
	p_a_dig3=NUM_OFF;p_a_dig4=NUM_OFF;
	
 	p_b_dig1=NUM_OFF;p_b_dig2=NUM_OFF;
	p_b_dig3=NUM_OFF;p_b_dig4=NUM_OFF;
#ifdef SEVEN_POSITIVE
	out_data=0xff;
#else
	out_data=0x00;
#endif
	
	p_A_part=out_data&1;out_data>>=1;
	p_B_part=out_data&1;out_data>>=1;
	p_C_part=out_data&1;out_data>>=1;

	p_D_part=out_data&1;out_data>>=1;
	p_E_part=out_data&1;out_data>>=1;
	p_F_part=out_data&1;out_data>>=1;
	p_G_part=out_data&1;out_data>>=1;
	p_DP_part=out_data&1; 
	
	switch(num_sel)
	{
		case 0:p_a_dig4=NUM_ON;break;
		case 1:p_a_dig3=NUM_ON;break;
		case 2:p_a_dig2=NUM_ON;break;
		case 3:p_a_dig1=NUM_ON;break;
		
		case 4:p_b_dig3=NUM_ON;break;
		case 5:p_b_dig2=NUM_ON;break;
		case 6:p_b_dig1=NUM_ON;break;
 			break;
		default:
			num_sel=0;
		break;
	}
	out_data=senddata[num_sel];	// 提取数据。
	p_A_part=out_data&1;out_data>>=1;
	p_B_part=out_data&1;out_data>>=1;
	p_C_part=out_data&1;out_data>>=1;

	p_D_part=out_data&1;out_data>>=1;
	p_E_part=out_data&1;out_data>>=1;
	p_F_part=out_data&1;out_data>>=1;
	p_G_part=out_data&1;out_data>>=1;
	p_DP_part=out_data&1; 
	
	num_sel++;
	if(num_sel>6) num_sel=0;
//	
//	if(num_sel==0) num_sel=6;
//	else 	num_sel--;
}
